Mustache

✒️ 2025-05-16 09:36 내용 수정

스프링부트3 자바 백엔드 개발입문 내용 참고 및 정리


Web template system


Spring boot에서 사용 설정

  1. Spring boot 프로젝트에서 src/main/resources/templates 폴더에 test.mustache 파일을 생성한다.

mustache 1.png

  1. 상단에 mustache 파일을 지원하는 플러그인이 발견되었다는 알림이 뜨면 Install Handlebars/Mustache plugin을 클릭해 플러그인을 다운 받는다.

mustache 2.png

  1. mustache 파일에서 !를 입력하고 Tab 키를 누르면 자동으로 html 코드가 작성된다.

mustache 3.png

mustache 4.png

  1. mustache 파일을 전송할 Controller를 작성한다. 먼저 src/main/java/package_namecontroller라는 패키지를 만든다.
  2. 패키지 내에 FirstController.java 파일을 만든다.

mustache 5.png

  1. Controller임을 명시하는 @Controller Annotation을 추가해주고, URL 요청을 받을 @GetMapping을 추가해 newToMustache() 메소드가 URL 요청이 들어왔을 때 동작을 수행할 수 있도록 설정한다.
  2. test.mustache를 반환하기 위해 파일명만 작성해 return "test";를 작성한다.

mustache 6.png

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        return "test"; // test.mustache 파일을 반환
    }
}
  1. src/main/java/package_name/ProjectNameApplication.java 파일을 우클릭해서 Run Application을 선택해 서버를 가동하고, http://localhost:port/test를 입력해 view가 잘 출력되는지 확인한다.

mustache 7.png

  1. 이제 test.mustache 파일을 뷰 템플릿 시스템으로 사용해보기 위해 파일 내에 {{변수명}}을 추가한다.
<h1>Hello Mustache!</h1>
<p>{{username}}님 반갑습니다!</p>
  1. FirstController.java 파일에서 org.springframework.ui.Model를 import 한다.
  2. Model modelnewToMustache() 매소드의 인자로 추가하고, model.addAttribute("변수명", "값")을 추가해 템플릿 엔진에서 지정한 변수명에 값을 넣어주도록 설정한다.
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        model.addAttribute("username", "tester"); // username 변수명에 tester를 추가
        return "test"; // test.mustache 파일을 반환
    }
}
  1. 서버를 다시 실행해서 같은 url을 요청했을 때 username 부분이 Model로 넣어준 값인지 확인한다.
    • 한글이 깨져서 나온다면 application.properties 파일이나 application.yml 파일에서 아래 설정을 추가한다.
# .properties 파일
server.servlet.encoding.force=true
# .yml 파일
server:
  servlet:
    encoding:
      force: true

mustache 8.png


문법

1. 변수 설정

<!-- { "name" : "tester" } -->
<p>Hello, {{name}}!</p>

mustache 9.png

2. HTML 이스케이프 방지

<!-- { "name" : "<strong>Jake</strong>" } -->
<p>Hello, {{name}}!</p>

mustache 10.png

<!-- { "name" : "<strong>Jake</strong>" } -->
<p>Hello, {{{name}}}!</p>

mustache 11.png

3. 주석

<!-- 이 부분은 html 주석 -->
{{! 이 부분은 mustache 주석 }}
<p>Hello, {{{name}}}!</p>

mustache 12.png

4. 조건부 렌더링(sections)

<p>Hello, {{{name}}}!</p>
{{#isActive}}
	{{{name}}} is Active!
{{/isActive}}
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        model.addAttribute("name", "Jake");
        return "test";
    }
}

mustache 14.png

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        model.addAttribute("name", "Jake");
        model.addAttribute("isActive", true);
        return "test";
    }
}

mustache 13.png

5. 배열 반복

<p>Hello, {{name}}!</p>
<ul>
	{{#items}}
		<li>{{.}}</li>
	{{/items}}
</ul>
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        String[] fruits = {"apple", "banana", "watermelon"};
        model.addAttribute("name", "Jake");
        model.addAttribute("items", fruits);
        return "test";
    }
}

mustache 15.png

6. 역조건 렌더링(inverted sections)

<!-- name에만 값을 넣고, isLoggedin에는 값을 넣지 않았다 -->
<p>Hello, {{name}}!</p>
{{^isLoggedin}}
	Please log in!
{{/isLoggedin}}

mustache 16.png

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class FirstController {
    @GetMapping("/test")
    public String newToMustache(Model model) {
        model.addAttribute("name", "Jake");
        model.addAttribute("isLoggedin", "yes");
        return "test"; // test.mustache 파일을 반환
    }
}

mustache 17.png

7. 다른 mustache 파일의 내용 가져오기(include)

{{! header.mustache }}
<p>Welcome!</p>
{{! footer.mustache }}
<p>Footer!</p>
{{! test.mustache }}

{{> header}}
<p>Hello, {{name}}!</p>
{{> footer}}

mustache 18.png

mustache 20.png

{{! index.mustache }}

{{> layouts/header}}
<p>Hello, {{name}}!</p>
{{> layouts/footer}}

8. 객체의 속성 접근

<p>Hello, {{name}}!</p>  
<div>  
    <p>car name : {{car.name}}</p>  
    <p>number : {{car.number}}</p>  
</div>
package com.example.demo.DTO;

import lombok.Data;

@Data // lombok
public class Car {
    String name;
    Integer number;
}
package com.example.demo.controller;  
  
import com.example.demo.DTO.Car;  
import org.springframework.stereotype.Controller;  
import org.springframework.ui.Model;  
import org.springframework.web.bind.annotation.GetMapping;  
  
@Controller  
public class FirstController {  
    @GetMapping("/test")  
    public String newToMustache(Model model) {  
        Car newCar = new Car();  
        newCar.setName("BMW");  
        newCar.setNumber(1234);  
        model.addAttribute("name", "Jake");  
        model.addAttribute("car", newCar);  
        return "test"; // test.mustache 파일을 반환  
    }  
}

mustache 19.png